/**
 * Notes: 云函数业务主文件
 * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux0730 (wechat)
 * Date: 2020-09-05 04:00:00 
 */

// Node运行时引入依赖 
require('module-alias/register');

// 项目指定 - 改为动态设置
// global.PID = 'oa';

// 云函数入口
module.exports = async (event, context) => {

	// 打印详细事件
	console.log('[EVENT] 完整事件对象:', JSON.stringify(event));

	// 变量 
	let r = { code: 1, data: {}, msg: '' };
	let logText = '';

	try {
		// 加载服务
		global.cloud = {};
		global.cloud.context = context;
		global.cloud.event = event;
		global.cloud.init = require('cloud-base').init;
		global.cloud.CloudBase = require('cloud-base');

		// 加载云函数环境
		cloud.init({
			env: cloud.CloudBase.getEnv()
		});

		//### 内核引入
		// 内核工具
		global.appUtil = require('app-util');
		// 内核缓存
		global.AppCache = require('app-cache');
		// 内核配置
		global.AppConfig = require('app-config');
		// 内核数据库  
		global.AppDatabase = require('app-database');
		// 内核通用数据库操作实体 
		global.AppModel = require('app-model');
		// 内核路由  
		global.AppRouter = require('app-router');
		// 内核用户校验  
		global.AppValidate = require('app-validate');
		// 内核日志
		global.AppLog = require('app-log');
		// 统一身份认证
		global.AppAuth = require('./framework/core/app_auth.js');
		// 路由助手
		global.RouteHelper = require('./framework/core/route_helper.js');

		// 云函数使用
		global.CLOUDBASE_COLLECTION = {};
		global.CLOUDBASE_COLLECTION_NAME = {};

		// 内核上下文
		global.AppContext = {
			ADMIN_LOGIN_EXPIRE: 86400,
			ADMIN_TOKEN_KEY: 'AdminToken', 
		};

		// 注册跨项目服务
		await registerCrossServices();
		
		// 根据请求动态确定PID
		determinePID(event);

		// 跨项目API身份认证
		if (RouteHelper.isCrossProjectApi(event.route) || RouteHelper.isSystemRoute(event.route)) {
			// 对于跨项目API调用，执行统一身份认证
			console.log('[AUTH] 检测到跨项目API调用，执行身份认证');
			const authResult = await AppAuth.authMiddleware(event);
			event._authResult = authResult; // 将认证结果附加到事件对象上，供后续使用
		}

		// 加载业务路由
		let routes = null;
		if (RouteHelper.isSystemRoute(event.route)) {
			// 系统路由使用公共路由
			routes = require('project/comm/public/route.js');
			console.log('[ROUTER] 使用系统路由');
		} else {
			// 其他API使用各自项目路由
			routes = require('project/' + global.PID + '/public/route.js');
			console.log('[ROUTER] 使用项目路由:', global.PID);
		}

		// 路由不存在
		if (!routes) {
			console.error('[SERVER] Routes Not Exist');
			return appUtil.handlerSvrErr();
		}

		// 统一入口
		console.log('[SERVER]', '-------apiUtil begin');
		r = await AppRouter.router({ routes, event, context });
		console.log('[SERVER]', '-------apiUtil END');
		return r;

	} catch (ex) {
		console.error('[SERVER]', 'Catch Exception err= ', ex);
		return appUtil.handlerSvrErr();
	}
}; 

/**
 * 应用初始化
 */
async function init() {
	// 设置一些全局变量
	global.PID = process.PID || 'dev';
	console.log('PID = ' + global.PID);

	// TODO 正式环境 取消下面注释
	// if (!global.NODE_ENV) global.NODE_ENV = 'dev'; 
	
	// 初始化云环境
	wx.cloud.init({
		env: config.CLOUD_ID
	});
	
	// 注册跨项目服务
	await registerCrossServices();
	
	// 获取全局配置
	await config.loadConfig();
}

/**
 * 注册跨项目服务
 */
async function registerCrossServices() {
	console.log('[APP] 开始注册跨项目服务');
	
	// 跨项目服务全局变量
	global.CROSS_SERVICE = {};
	
	try {
		// 注册OA项目跨项目服务
		try {
			global.CROSS_SERVICE.OA = require('./project/oa/service/cross_service');
			console.log('[APP] OA跨项目服务注册成功');
		} catch (err) {
			console.error('[APP] OA跨项目服务注册失败:', err);
		}
		
		// 注册PLM项目跨项目服务
		try {
			global.CROSS_SERVICE.PLM = require('./project/plm/service/cross_service');
			console.log('[APP] PLM跨项目服务注册成功');
		} catch (err) {
			console.error('[APP] PLM跨项目服务注册失败:', err);
		}
		
		console.log('[APP] 跨项目服务注册完成');
	} catch (err) {
		console.error('[APP] 跨项目服务注册异常:', err);
	}
}

/**
 * 根据请求动态确定PID
 * @param {Object} event 请求事件
 */
function determinePID(event) {
	if (!event || !event.route) {
		global.PID = 'oa'; // 默认OA项目
		console.log('[PID] 未找到路由信息，使用默认PID=oa');
		return;
	}
	
	// 如果明确指定了PID，使用指定的PID
	if (event.PID) {
		global.PID = event.PID;
		console.log('[PID] 使用请求指定的PID=', global.PID);
		return;
	}
	
	// 使用路由助手解析PID
	const routeInfo = RouteHelper.parseRoute(event.route);
	global.PID = routeInfo.pid;
	
	console.log(`[PID] 根据路由解析设置PID=${global.PID}, 路由=${event.route}`);
}

// 初始化
init().then(() => {
	console.log('App init');
}); 